合成功能让您能够绘制分层图形,您可以控制每个图层的外观(由其下面的图层外观决定)。
混合功能能将半透明的上图层和下图层组合到一起,构成新的混合色。上图层的阿尔法通道规定了混合后图层的透明度。要决定 Kanzi 如何混合两个图层,请在材质中设置 混合模式 (Blend Mode) 属性。请参阅 Kanzi 中的混合模式。
在使用合成与混合功能时,Kanzi 会要求您输入纹理数据以获取预乘阿尔法,之后,由 Kanzi 输出预乘阿尔法。Kanzi 支持多图层的复杂合成,您可以借助外部合成窗口管理器,使用 Kanzi 输出的值。
RGBA 像素拥有红、绿、蓝三种颜色通道以及阿尔法通道的值,该值决定了像素的透明度。为实现阿尔法的混合,Kanzi 会将来自纹理数据的 RGB 通道同一个阿尔法值进行预乘。
{Red * Alpha, Green * Alpha, Blue * Alpha, Alpha}
使用纹理数据让纹理过滤和插值能够同阿尔法一起正常工作。
Kanzi 中的着色器用于输出带有预乘阿尔法的 RGBA 值。当写入着色器时,您必须用片段的 RGB 输出值乘以其阿尔法值。这样,部分透明节点中像素的颜色值才不会在部分透明区域的边缘外部混合,从而避免在部分透明节点四周出现白边问题。
当您导出 kzb 文件时,Kanzi Studio 默认用阿尔法值乘以 RGB 值。要更改此设置,在 > 中使用 预乘阿尔法 (Premultiply Alpha) 属性。您可以重写想要使用不同设置的图像文件中的该属性值。例如,将您 Kanzi 应用程序动态加载的未预处理纹理图像的 预乘阿尔法 (Premultiply Alpha) 设置为 False,这些图像使用不进行 RGB 颜色阿尔法预乘运算的片段着色器。
要决定 Kanzi 如何混合两个图层,请在材质中设置 混合模式 (Blend Mode) 属性。
混合模式 (Blend Mode) | 描述 | glBlendFunc |
---|---|---|
不透明 (Opaque) | 该模式下会将源片段的 RGBA 值复制到目标帧缓冲区,并覆盖现有值。结果与混合 glBlendFunc(GL_ONE, GL_ZERO) 相同。这是唯一禁用 GL_BLEND 的混合模式。 |
glDisable(GL_BLEND)
|
阿尔法: 自动 (Alpha: Automatic) | 该模式下,混合模式处于以下其中一种状态。
|
不可用 |
阿尔法: 非预乘 (Alpha: Non-premultiplied) | 旧模式。如需使用非预乘输入,请使用 阿尔法: 混合 (Alpha: Mixed) 模式。 阿尔法: 非预乘 (Alpha: Non-premultiplied) 模式下要求使用源片段的非预乘阿尔法 RGBA,并将源片段同目标帧缓冲区进行混合。请注意,这样操作会在目标帧缓冲区中生成一个错误的阿尔法通道。当渲染为纹理时,您无法使用此模式,因为渲染出的纹理之后会混为前景。 |
glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA)
|
阿尔法: 预乘 (Alpha: Premultiplied) | 这是阿尔法混合的默认和推荐模式。 阿尔法: 预乘 (Alpha: Premultiplied) 模式预期源片段中的预乘阿尔法 RGBA,并将源片段与目的地帧缓冲区进行混合。 |
glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA)
|
阿尔法: 混合 (Alpha: Mixed) | 该模式预期源片段中的非预乘阿尔法 RGBA,并将源片段与目的地帧缓冲区进行混合。 例如,您可以使用 阿尔法: 混合 (Alpha: Mixed) 模式,未经预处理而动态加载某一纹理,而该纹理使用的片段着色器不对 RGB 颜色执行阿尔法预乘。 |
glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ONE GL_ONE_MINUS_SRC_ALPHA)
|
附加 (Additive) | 该模式为目的地帧缓冲区新增了源片段。 使用 附加 (Additive) 模式实现为某图层添加 RGB 颜色,但不减少其下一层图层 RGB 颜色的效果。 |
glBlendFunc(GL_ONE, GL_ONE)
|